﻿using System;
using System.Text;
using Sireass.Dal;
using System.Data.SqlClient;
using Csla.Data;
using log4net;

namespace Sireass.DalSql
{
    public class ProyectoEncargadoDal : IProyectoEncargadoDal
    {
		// Create a logger for use in this class
		private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
		private SqlParameter accion = null;
        private string nombreProcedimiento = null;

        public ProyectoEncargadoDal()
        {
            accion = new SqlParameter("@Accion", System.Data.SqlDbType.SmallInt);
            nombreProcedimiento = "spSireassCatProyectoEncargado";
        }
        
        public System.Data.IDataReader Fetch()
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                var cm = ctx.Connection.CreateCommand();
                cm.CommandType = System.Data.CommandType.StoredProcedure;
                cm.CommandText = nombreProcedimiento;
                cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.CONSULTAR);
                return cm.ExecuteReader();
            }
        }

        public System.Data.IDataReader Fetch(long idProyectoEncargado)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                var cm = ctx.Connection.CreateCommand();
                cm.CommandType = System.Data.CommandType.StoredProcedure;
                cm.CommandText = nombreProcedimiento;
                cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.CONSULTAR);
                cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idProyectoEncargado);
                return cm.ExecuteReader();
            }
        }

		public System.Data.IDataReader Fetch(long? idProyectoEncargado, long? idProyecto, long? idPersonaEncargado, bool? habilitado)
		{
			using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
			{
				var cm = ctx.Connection.CreateCommand();
				cm.CommandType = System.Data.CommandType.StoredProcedure;
				cm.CommandText = nombreProcedimiento;
				cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.CONSULTAR);
				if (idProyectoEncargado != null)
					cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idProyectoEncargado.Value);
				if (idProyecto != null)
					cm.Parameters.AddWithValue("@nId_Proyecto", idProyecto.Value);
				if (idPersonaEncargado != null)
					cm.Parameters.AddWithValue("@nId_Persona_Encargado", idPersonaEncargado.Value);				
				if (habilitado != null)
					cm.Parameters.AddWithValue("@bHabilitado", habilitado.Value);
				if (log.IsDebugEnabled)
				{
					foreach (SqlParameter param in cm.Parameters)
					{
						log.Debug(param.ParameterName + ": " + param.Value);
					}
				}
				return cm.ExecuteReader();
			}
		}

        public long Insert(long idProyecto, long idPersonaEncargado, bool habilitado)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                using (var cm = ctx.Connection.CreateCommand())
                {
                    cm.CommandType = System.Data.CommandType.StoredProcedure;
                    cm.CommandText = nombreProcedimiento;
                    cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.INSERTAR);
                    cm.Parameters.AddWithValue("@nId_Proyecto", idProyecto);
                    cm.Parameters.AddWithValue("@nId_Persona_Encargado", idPersonaEncargado);
                    cm.Parameters.AddWithValue("@bHabilitado", habilitado);

                    SqlParameter paramIdProyecto = new SqlParameter("@nld_Proyecto_Encargado", System.Data.SqlDbType.TinyInt);
                    paramIdProyecto.Direction = System.Data.ParameterDirection.Output;
                    cm.Parameters.Add(paramIdProyecto);
                    cm.ExecuteNonQuery();
                    return Convert.ToInt64(paramIdProyecto.Value);
                }
            }
        }

        public void Update(long idProyectoEncargado, long idProyecto, long idPersonaEncargado, bool habilitado, DateTime fechaAlta, DateTime fechaBaja)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                using (var cm = ctx.Connection.CreateCommand())
                {
                    cm.CommandType = System.Data.CommandType.StoredProcedure;
                    cm.CommandText = nombreProcedimiento;
                    cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.ACTUALIZAR);
                    cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idProyectoEncargado);
                    cm.Parameters.AddWithValue("@nId_Proyecto", idProyecto);
                    cm.Parameters.AddWithValue("@nId_Persona_Encargado", idPersonaEncargado);
                    cm.Parameters.AddWithValue("@bHabilitado", habilitado);
                    cm.Parameters.AddWithValue("@dFecha_Alta", fechaAlta);
                    cm.Parameters.AddWithValue("@dFecha_Baja", fechaBaja);

                    var rowsAffected = cm.ExecuteNonQuery();
                    if (rowsAffected == 0)
                        throw new DataNotFoundException("ProyectoEncargadoUpdate");
                }
            }
        }

        public void Delete(long idProyectoEncargado)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                using (var cm = ctx.Connection.CreateCommand())
                {
                    cm.CommandType = System.Data.CommandType.StoredProcedure;
                    cm.CommandText = nombreProcedimiento;
                    cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.ELIMINAR);
                    cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idProyectoEncargado);
                    var rowsAffected = cm.ExecuteNonQuery();
                    if (rowsAffected == 0)
                        throw new DataNotFoundException("ProyectoEncargadoDelete");
                }
            }
        }
    }
}
